<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //声明一个叫'fun1'函数
    //fun1()//函数提升
    function fun1() {
        console.log('函数fun1成功被调用');
    }
    fun1()//'调用函数'
    //封装了一个名叫'fun2'的函数，作用是可以进行加法运算'
    function fun2(a, b) {
        return a + b
    }
    console.log(fun2(10, 20));
    //实参如果是基本数据类型(number，string,bol)在函数中修改形参的值，不影响原数据，如果是(arr ,obj)等引用形数据类型，会修改原数据
    let a = 10
    function fun3(n) {
        n++
        console.log(n);
    }
    fun3(a)

    let obj = { name: '张三', age: '28' }
    function fun4(info) {
        info.name = '李四'
    }
    fun4(obj)
    console.log(obj);
    //变量声明函数
    let fun6 = function () {
        console.log('成功调用我了！！！！！！！！！');

    }
    fun6();
    //匿名函数 自调用函数
    (function (a, b) {
        console.log('我是匿名函数');
        console.log(a + b);

    })(10, 20)
    //参数作用域
    function fun7(a, b) {
        console.log(a, b);
        let str = 'abc'
    }
    // console.log(b);

    //参数默认值
    function fun8(str, num) {
        num = num == undefined ? 0 : num
        str = str || '我是默认值'
        console.log(str, '----', num);
    }
    fun8('ok', 20)
    //若是不传实参则用默认值，若穿则用传的值

    //对位传参
    function fun9(name, age, sex, job, hight) {
        console.log(`姓名：${name}--年龄${age}--性别${sex}--工作${job}--身高${hight}`);
    }
    fun9('张三', 29, '男', '码农', 178)
    //arguments对象
    function fun10() {
        console.log(arguments);
        //arguments.map() //arguments 是一个伪数组  有数组的下标和长度属性 但不能使用数组的方法
        arguments = Array.prototype.slice.call(arguments)//用数组原型链中方法将伪数组转换为正真的数组
        console.log(arguments);
        let sum = arguments.reduce(function (per, cur) {
            return per += cur

        }, 0)
        // let sum = 0
        // for (let i = 0; i < arguments.length; i++) {
        //     sum += arguments[i]
        // }
        console.log(sum);
        console.log(Array);
    }

    var stu = { name: "张4", major: "软件技术" };
    function test_2(obj) {
        obj.major = "软件工程";
    }
    test_2(stu);
    function test_1(boj) {
        boj.major = '雷霆嘎巴'
    }
    test_1(stu);
    console.log(stu.major); // 软件工程

    var m = 10;
    function test_1(n) {
        n = 20;
        console.log(m, n);// 10 20
    }
    test_1(m);
    console.log(m);

    //函数返回值
    let num = 5
    function fun11() {
        console.log(('retrun之前正常执行'));
        return 5 * 2
        console.log('retrun之后不执行');
    }
    console.log(fun11());
    //闭包函数
    function fun12() {
        let i = 0;
        console.log(i);
        function fun13() {
            i = i + 1
            console.log((i));
        }
    }

    //递归函数

    function fun15(n) {
        console.log(n);
        if (n <= 1) {
            return 1
        } else {
            return n * fun15(n - 1)
        }


    } fun15(10)
</script>